/* * Copyright 2014-2015 Daniel Pedraza-Arcega * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.grayfox.android.client; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import com.grayfox.android.client.model.Category; import com.grayfox.android.client.model.Location; import com.grayfox.android.client.model.Poi; import com.grayfox.android.client.model.Recommendation; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.MockWebServer; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; @Config(emulateSdk = 18) @RunWith(RobolectricTestRunner.class) public class PoisApiTest { private static MockWebServer mockWebServer; private PoisApi poisApi; @BeforeClass public static void setUpClass() throws Exception { mockWebServer = new MockWebServer(); mockWebServer.start(); } @AfterClass public static void tearDownClass() throws Exception { mockWebServer.shutdown(); } @Before public void setUp() throws Exception { poisApi = spy(new PoisApi(Robolectric.application)); doReturn(mockWebServer.getUrl("/").toString()).when(poisApi).getString(R.string.gf_api_base_url); } @Test public void testSearchByCategory() throws Exception { Location location = new Location(); location.setLatitude(19.053528); location.setLongitude(-98.283187); Category category = new Category(); category.setName("Coffee Shop"); category.setIconUrl("https://ss3.4sqi.net/img/categories_v2/food/default_88.png"); category.setFoursquareId("4bf58dd8d48988d1e0931735"); Poi poi1 = new Poi(); poi1.setName("Starbucks"); poi1.setLocation(new Location()); poi1.getLocation().setLatitude(19.051916205742696); poi1.getLocation().setLongitude(-98.21938276290894); poi1.setFoursquareId("4c2ec541ac0ab713fa9b1b1e"); poi1.setFoursquareRating(7.4); poi1.setCategories(new Category[]{category}); Poi poi2 = new Poi(); poi2.setName("Profética - Casa de la Lectura"); poi2.setLocation(new Location()); poi2.getLocation().setLatitude(19.04288527071933); poi2.getLocation().setLongitude(-98.20153534412384); poi2.setFoursquareId("4baace32f964a520a7873ae3"); poi2.setFoursquareRating(8.9); poi2.setCategories(new Category[]{category}); Poi[] expectedResponse = {poi1, poi2}; mockWebServer.enqueue(new MockResponse() .setStatus("HTTP/1.1 500 Internal Server Error") .setBody(getJsonFrom("responses/pois.json"))); Poi[] actualResponse = poisApi.awaitSearchByCategory(location, 20_000, category.getFoursquareId()); assertThat(actualResponse).isNotNull().isNotEmpty().hasSize(expectedResponse.length).isEqualTo(expectedResponse); } @Test(expected = ApiException.class) public void testSearchByCategoryError() throws Exception { Location location = new Location(); location.setLatitude(19.053528); location.setLongitude(-98.283187); mockWebServer.enqueue(new MockResponse() .setStatus("HTTP/1.1 500 Internal Server Error") .setBody(getJsonFrom("responses/error.json"))); poisApi.awaitSearchByCategory(location, 20_000, "fakeId"); } @Test public void testAwaitRoute() throws Exception { Category category = new Category(); category.setName("Coffee Shop"); category.setIconUrl("https://ss3.4sqi.net/img/categories_v2/food/default_88.png"); category.setFoursquareId("4bf58dd8d48988d1e0931735"); Poi poi1 = new Poi(); poi1.setName("Starbucks"); poi1.setLocation(new Location()); poi1.getLocation().setLatitude(19.051916205742696); poi1.getLocation().setLongitude(-98.21938276290894); poi1.setFoursquareId("4c2ec541ac0ab713fa9b1b1e"); poi1.setFoursquareRating(7.4); poi1.setCategories(new Category[]{category}); Poi poi2 = new Poi(); poi2.setName("Profética - Casa de la Lectura"); poi2.setLocation(new Location()); poi2.getLocation().setLatitude(19.04288527071933); poi2.getLocation().setLongitude(-98.20153534412384); poi2.setFoursquareId("4baace32f964a520a7873ae3"); poi2.setFoursquareRating(8.9); poi2.setCategories(new Category[]{category}); Poi[] expected = {poi1, poi2}; mockWebServer.enqueue(new MockResponse() .setStatus("HTTP/1.1 200 OK") .setBody(getJsonFrom("responses/pois.json"))); assertThat(poisApi.awaitRoute("fakeFoursquareId")).isNotNull().isNotEmpty().hasSize(expected.length).isEqualTo(expected); } @Test(expected = ApiException.class) public void testAwaitRouteError() throws Exception { mockWebServer.enqueue(new MockResponse() .setStatus("HTTP/1.1 500 Internal Server Error") .setBody(getJsonFrom("responses/error.json"))); poisApi.awaitRoute("fakeFoursquareId"); } @Test public void testAwaitCategoriesLikeName() throws Exception { Category category1 = new Category(); category1.setName("Argentinian Restaurant"); category1.setIconUrl("https://ss3.4sqi.net/img/categories_v2/food/default_88.png"); category1.setFoursquareId("4bf58dd8d48988d107941735"); Category category2 = new Category(); category2.setName("Mexican Restaurant"); category2.setIconUrl("https://ss3.4sqi.net/img/categories_v2/food/default_88.png"); category2.setFoursquareId("4bf58dd8d48988d1c1941735"); Category[] expectedResponse = {category1, category2}; mockWebServer.enqueue(new MockResponse() .setStatus("HTTP/1.1 200 OK") .setBody(getJsonFrom("responses/categories.json"))); Category[] actualResponse = poisApi.awaitCategoriesLikeName("rest"); assertThat(actualResponse).isNotNull().isNotEmpty().hasSize(expectedResponse.length).isEqualTo(expectedResponse); } @Test(expected = ApiException.class) public void testAwaitCategoriesLikeNameError() throws Exception { mockWebServer.enqueue(new MockResponse() .setStatus("HTTP/1.1 500 Internal Server Error") .setBody(getJsonFrom("responses/error.json"))); poisApi.awaitCategoriesLikeName("rest"); } @Test public void testAwaitRecommendations() throws Exception { Location location = new Location(); location.setLatitude(19.053528); location.setLongitude(-98.283187); Recommendation r1 = new Recommendation(); r1.setType(Recommendation.Type.SELF); r1.setReason("You liked Italian Restaurant"); r1.setPoi(new Poi()); r1.getPoi().setName("Vittorio's"); r1.getPoi().setLocation(new Location()); r1.getPoi().getLocation().setLatitude(19.043296008919373); r1.getPoi().getLocation().setLongitude(-98.19728136062622); r1.getPoi().setFoursquareId("4c22837f9a67a593219edc87"); r1.getPoi().setFoursquareRating(8.6); r1.getPoi().setCategories(new Category[1]); r1.getPoi().getCategories()[0] = new Category(); r1.getPoi().getCategories()[0].setName("Italian Restaurant"); r1.getPoi().getCategories()[0].setIconUrl("https://ss3.4sqi.net/img/categories_v2/food/default_88.png"); r1.getPoi().getCategories()[0].setFoursquareId("4bf58dd8d48988d110941735"); Recommendation r2 = new Recommendation(); r2.setType(Recommendation.Type.SOCIAL); r2.setReason("Your friend Jane Doe liked Brewery"); r2.setPoi(new Poi()); r2.getPoi().setName("El Corona"); r2.getPoi().setLocation(new Location()); r2.getPoi().getLocation().setLatitude(19.046120299277323); r2.getPoi().getLocation().setLongitude(-98.20206759449505); r2.getPoi().setFoursquareId("4ce636f3708460fc485e86c3"); r2.getPoi().setFoursquareRating(8.2); r2.getPoi().setCategories(new Category[1]); r2.getPoi().getCategories()[0] = new Category(); r2.getPoi().getCategories()[0].setName("Brewery"); r2.getPoi().getCategories()[0].setIconUrl("https://ss3.4sqi.net/img/categories_v2/nightlife/default_88.png"); r2.getPoi().getCategories()[0].setFoursquareId("50327c8591d4c4b30a586d5d"); Recommendation r3 = new Recommendation(); r3.setType(Recommendation.Type.GLOBAL); r3.setReason("This place is popular"); r3.setPoi(new Poi()); r3.getPoi().setName("La Pasita"); r3.getPoi().setLocation(new Location()); r3.getPoi().getLocation().setLatitude(19.04104454259915); r3.getPoi().getLocation().setLongitude(-98.19588661193848); r3.getPoi().setFoursquareId("4c095fd97e3fc928ddddf182"); r3.getPoi().setFoursquareRating(9.0); r3.getPoi().setCategories(new Category[1]); r3.getPoi().getCategories()[0] = new Category(); r3.getPoi().getCategories()[0].setName("Cocktail Bar"); r3.getPoi().getCategories()[0].setIconUrl("https://ss3.4sqi.net/img/categories_v2/nightlife/default_88.png"); r3.getPoi().getCategories()[0].setFoursquareId("4bf58dd8d48988d11e941735"); Recommendation[] expected = {r1, r2, r3}; mockWebServer.enqueue(new MockResponse() .setStatus("HTTP/1.1 200 OK") .setBody(getJsonFrom("responses/recommendations.json"))); assertThat(poisApi.awaitRecommendations("fakeAccessToken", location, 3000)).isNotNull().isNotEmpty().hasSize(expected.length).isEqualTo(expected); } @Test(expected = ApiException.class) public void testAwaitRecommendationsError() throws Exception { Location location = new Location(); location.setLatitude(19.053528); location.setLongitude(-98.283187); mockWebServer.enqueue(new MockResponse() .setStatus("HTTP/1.1 500 Internal Server Error") .setBody(getJsonFrom("responses/error.json"))); poisApi.awaitRecommendations("fakeAccessToken", location, 3000); } private String getJsonFrom(String file) throws Exception { InputStream in = getClass().getClassLoader().getResourceAsStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(in)); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) sb.append(line).append('\n'); br.close(); return sb.toString(); } }